# -*- coding:utf-8 -*-
"""
@Time : 2020-12-20 14:46
@Author: langengel
@Des: 二维码

【红色】：red 【橙色】：orange 【黄色】：yellow 【绿】：green 【 蓝】：blue【紫】：purple
【灰色】：gray 【白色】：white 【粉红色】：pink 【黑色】：black【墨绿色】：dark green 【橙红色】：orange-red

QRCode参数详细说明：
    version: 一个整数，范围为1到40，表示二维码的大小（最小值是1，是个12×12的矩阵），如果想让程序自动生成，将值设置为 None 并使用 fit=True 参数即可。
    error_correction: 二维码的纠错范围，可以选择4个常量：
        ERROR_CORRECT_L 7%以下的错误会被纠正
        ERROR_CORRECT_M (default) 15%以下的错误会被纠正
        ERROR_CORRECT_Q 25 %以下的错误会被纠正
        ERROR_CORRECT_H. 30%以下的错误会被纠正
    boxsize: 每个点（方块）中的像素个数
    border: 二维码距图像外围边框距离，默认为4，而且相关规定最小为4
"""

import qrcode
from PIL import Image, ImageDraw
from config.template import STATIC_DIR


def qr_code(text: str):
    """
    普通二维码
    :param text: 文本内容
    :return: img
    """
    qr = qrcode.QRCode(
        version=None,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=6,
        border=4,
    )
    qr.add_data(text)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    # 图片转换为RGBA格式
    img = img.convert("RGBA")
    return img


def circle_crop_image(im, radii):
    """
    设置圆角
    :param im:
    :param radii: 圆角大小
    :return: img
    """
    # 创建一个黑色背景的画布
    circle = Image.new('L', (radii * 2, radii * 2), 0)
    # 画黑色方形
    draw = ImageDraw.Draw(circle)
    # 画白色圆形
    draw.ellipse((0, 0, radii * 2, radii * 2), fill=255)
    # 把原图转换成RGBA模式，增加alpha通道
    img = im.convert("RGBA")
    w, h = img.size
    # 画4个角（将整圆分离为4个部分）再粘贴到alpha通道
    alpha = Image.new('L', img.size, 255)
    # 左上角
    alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0))
    # 右上角
    alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0))
    # 右下角
    alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii))
    # 左下角
    alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii))
    # 白色区域透明可见，黑色区域不可见
    img.putalpha(alpha)
    return img


def icon_qr_code(text: str):
    """
    Icon二维码
    :param text: 文本字符串
    :return: img
    """
    qr = qrcode.QRCode(
        version=None,
        # 设置容错率为最
        error_correction=qrcode.ERROR_CORRECT_M,
        box_size=6,
        border=4,
    )
    qr.add_data(text)
    qr.make(fit=True)
    # 创建二维码图片
    img = qr.make_image()
    # 图片转换为RGBA格式
    img = img.convert("RGBA")
    # 打开logo图片
    icon = Image.open(STATIC_DIR + '/login.png')
    # 把RGB的图转换成RGBA模式，处理alpha透明通道（后边替换透明为白色）
    icon = icon.convert("RGBA")
    w, h = img.size
    icon_w, icon_h = icon.size
    # logo大小超过100的压缩到100，这个可以自己设置，影响logo的大小
    icon_size = 100
    if icon_w > icon_size:
        icon = icon.resize((icon_size, icon_size), Image.ANTIALIAS)
        icon_w, icon_h = icon.size
        w = int((w - icon_size) / 2)
        h = int((h - icon_size) / 2)
    else:
        w = int((w - icon_w) / 2)
        h = int((h - icon_h) / 2)
    # 把png背景色转换为白色，避免处理裁剪圆角时出现黑边
    background_img = Image.new('RGBA', icon.size, (255, 255, 255))
    background_img.paste(icon, (0, 0, icon_w, icon_h), icon)
    # r = icon_w // 15
    # 圆角半径
    r = 8
    # 圆角处理
    icon = circle_crop_image(background_img, r)
    # 白底图，15的数值影响白色底图的大小
    white_img = Image.new("RGBA", (icon_w + 20, icon_h + 20), (255, 255, 255))
    white_img = circle_crop_image(white_img, r)
    # 灰底图
    gray_img = Image.new("RGBA", (icon_w + 10, icon_h + 10), (230, 230, 230))
    # 灰底图圆角处理
    gray_img = circle_crop_image(gray_img, r)
    # 粘贴灰底图
    white_img.paste(gray_img, (5, 5), gray_img)
    # 粘贴白图
    img.paste(white_img, (w - 10, h - 10), white_img)
    # 粘贴icon，(w + 5, h + 5)为左上角坐标，数值大小配合white_img的数值大小调整，影响白色边框的宽度
    img.paste(icon, (w + 0, h + 0), icon)
    return img
